package cn.xm.lingshi.utlis;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
/**
 * 数据库工具类（封装JDBC操作） 1：数据库的打开连接和释放资源 2：通用的增、删、改、查操作
 * 
 */
public class BaseDao {
	private Connection connection = null; // 数据库连接对象
	private PreparedStatement smt = null;
	private static String driver=null;
	private static String url=null;
	private static String user=null;
	private static String password=null;
	
	
	/**
	 * 数据源的问题
	 * @return
	 */
	public Connection getConnection() {
		try {
			//通过JNDI查找Tomcat上的数据源
			Context ext=new InitialContext();
			DataSource ds=(DataSource)ext.lookup("java:comp/env/jdbc/lingshi");
			connection=ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}
	/**
	 * 打开连接
	 * 
	 * @return
	 */
	public Connection getConnection2() {
		try {
			driver=ConfigManager.getInstance().getValue("driver");
			url=ConfigManager.getInstance().getValue("url");
			user=ConfigManager.getInstance().getValue("user");
			password=ConfigManager.getInstance().getValue("password");
			// 1.加载驱动(反射)
			Class.forName(driver);
			// 2.获取Connection对象
			connection = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}
	
	/**
	 * 释放资源
	 */
	public void closeResource(ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		try {
			if (smt != null) {
				smt.close();
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		try {
			if (connection != null) {
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 通用的增、删、改操作
	 * @param preparedSql 预编译的SQL(insert update delete)
	 * @param params 参数
	 * @return 受影响的行数
	 * @throws Exception
	 */
	public int executeUpdate(String preparedSql, Object[] params)
			throws Exception {
		// 1:获取连接
		getConnection2();
		// 2:创建PreparedStatement对象,传递参数
		smt = connection.prepareStatement(preparedSql);
		if (params != null) {
			// 如果传递了参数数组，给占位符赋值
			for (int i = 0; i < params.length; i++) {
				// 给参数赋值
				smt.setObject(i + 1, params[i]);
			}
		}
		// 3:执行SQL语句
		return smt.executeUpdate();
	}
	/**
	 * 执行查询操作
	 * @param preparedSql 查询语句
	 * @param params 查询参数
	 * @return
	 * @throws Exception
	 */
	public ResultSet executeQuery(String preparedSql, Object[] params)
			throws Exception {
		// 1:获取连接
		getConnection2();
		// 2:创建PreparedStatement对象,传递参数
		smt = connection.prepareStatement(preparedSql);
		if (params != null) {
			// 如果传递了参数数组，给占位符赋值
			for (int i = 0; i < params.length; i++) {
				// 给参数赋值
				smt.setObject(i + 1, params[i]);
				
			}
		}
		// 3:执行SQL语句
		return smt.executeQuery();
	}
	public static void main(String[] args) {
		BaseDao d=new BaseDao();
		System.out.println(d.getConnection2());
	}

}
